﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Chinaer.DTO.AttriLib;
using Omu.ValueInjecter;

namespace Chinaer.Core.Helper
{
    public class DTOtoEntityObjectHelper
    {
        private static IValueInjecter valueInjecter = null;
        private static DTOtoEntityObjectHelper _instance = null;
        public static DTOtoEntityObjectHelper Instance
        {
            get
            {
                if (_instance == null)
                {
                    _instance = new DTOtoEntityObjectHelper();
                }
                if (valueInjecter == null)
                {
                    valueInjecter = new ValueInjecter();
                }
                return _instance;
            }

        }
        /// <summary>
        /// DTO转换成实体模型
        /// </summary>
        /// <param name="dto"></param>
        /// <param name="eo"></param>
        public object DTOtoEntityObject(object dto, object eo)
        {
            #region 注释
            
            //System.Reflection.PropertyInfo[] dtoPropertys = dto.GetType().GetProperties();
            //System.Type t = dto.GetType();

            //foreach (System.Reflection.PropertyInfo dtoPropertyInfo in dtoPropertys)
            //{
            //    System.Reflection.PropertyInfo[] eoPropertys = eo.GetType().GetProperties();
            //    foreach (System.Reflection.PropertyInfo eoPropertyInfo in eoPropertys)
            //    {
            //        bool blFlag = false;
            //        if (eoPropertyInfo.Name == dtoPropertyInfo.Name)
            //        {
            //            switch (eoPropertyInfo.PropertyType.Name)
            //            {
            //                case "DateTime":
            //                    eoPropertyInfo.SetValue(eo, System.DateTime.Parse(t.InvokeMember(dtoPropertyInfo.Name, System.Reflection.BindingFlags.GetProperty, null, dto, null).ToString()), null);
            //                    break;
            //                case "Boolean":
            //                    object tmpObj = t.InvokeMember(dtoPropertyInfo.Name, System.Reflection.BindingFlags.GetProperty, null, dto, null);
            //                    Boolean tmpBool = false;
            //                    try
            //                    {
            //                        if (tmpObj != null)
            //                        {
            //                            if (tmpObj.ToString() == "1")
            //                            {
            //                                tmpBool = true;
            //                            }
            //                            else
            //                            {
            //                                tmpBool = System.Boolean.Parse(tmpObj.ToString());
            //                            }
            //                        }
            //                    }
            //                    catch
            //                    {
            //                    }
            //                    eoPropertyInfo.SetValue(eo, tmpBool, null);
            //                    break;
            //                default:
            //                    eoPropertyInfo.SetValue(eo, t.InvokeMember(dtoPropertyInfo.Name, System.Reflection.BindingFlags.GetProperty, null, dto, null), null);
            //                    break;
            //            }
            //            blFlag = true;
            //        }
            //        else
            //        {
            //            System.Attribute[] attrPropertys = System.Attribute.GetCustomAttributes(eoPropertyInfo);
            //            foreach (System.Attribute attribute in attrPropertys)
            //            {
            //                if (attribute is Column)
            //                {
            //                    Column column = (Column)attribute;
            //                    if (column.Name == dtoPropertyInfo.Name)
            //                    {
            //                        switch (eoPropertyInfo.PropertyType.Name)
            //                        {
            //                            case "DateTime":
            //                                eoPropertyInfo.SetValue(eo, System.DateTime.Parse(t.InvokeMember(dtoPropertyInfo.Name, System.Reflection.BindingFlags.GetProperty, null, dto, null).ToString()), null);
            //                                break;
            //                            case "Boolean":
            //                                object tmpObj = t.InvokeMember(dtoPropertyInfo.Name, System.Reflection.BindingFlags.GetProperty, null, dto, null);
            //                                Boolean tmpBool = false;
            //                                try
            //                                {
            //                                    tmpBool = System.Boolean.Parse(tmpObj.ToString());
            //                                }
            //                                catch
            //                                {
            //                                }
            //                                eoPropertyInfo.SetValue(eo, tmpBool, null);
            //                                break;
            //                            default:
            //                                eoPropertyInfo.SetValue(eo, t.InvokeMember(dtoPropertyInfo.Name, System.Reflection.BindingFlags.GetProperty, null, dto, null), null);
            //                                break;
            //                        }
            //                        blFlag = true;
            //                        break;
            //                    }
            //                }
            //            }
            //        }
            //        if (blFlag)
            //        {
            //            break;
            //        }
            //    }
            //}
            #endregion
            if (dto == null)
            {
                return null;
            }
            eo.InjectFrom(dto);
            return eo;
        }
    }
}
